package org.aceor.mddal.common.sqlparser;

import org.aceor.mddal.common.sqlparser.result.SQLBuilder;

/**
 * Created by lxue on 16/3/21.
 */
public interface MysqlVisitor {

    /**
     * 解析过程中的上下文对象
     * @return
     */
    ParseContext getParseContext();

    /**
     * sql语句构造器.
     * 支持sql中的ReplaceToken替换和ColumnAppendToken添加
     * @return
     */
    SQLBuilder getSQLBuilder();

    /**
     * sqlBuilder中新增一个替换标记对象
     * 使用场景:
     * 1. 表名 select * from table_a(这个在分库分表时需要替换,因此打印标记)
     * 2. 属性字段 select * from table_a where table_a.id(这里的表名也需要标记) = 1
     * @param replaceToken
     */
    void printReplaceToken(String replaceToken);

    /**
     * sqlBuilder中注册一个列添加标记对象
     * 用于SqlAstVistor遍历完select列后注册
     * 当order by或group by字段在select列中不存在时回调添加列
     */
    void registerColumnAppendToken();

    /**
     * 当表达式>,=,>=,<,<=,between and,in等操作的列是分库分表列时,
     * sqlBuilder打印一个跳过而不输出对应表达式,仅把Condition表达式存到ConditionContext中
     * 为何不直接跳过,还要打印跳过标记? ==> 为了该表达式后面的and 或 or 去掉,不然会有语法错误
     */
    void printExprSkipToken();

}
